<?php
/**
 * Cookie操作関数<br />
 *
 * @package apamanshop
 * @author
 * @copyright
 */
class Rstdtl_Model_Dtlcookie extends Rstdtl_Model_Base {


	/**
	*	連結文字追加
	*	対象文字列の最後尾に連結文字列を追加する。
	*
	*	strValue：対象文字列
	**	connect ：連結文字列
	*/
	public function addConnectStr($strValue,$connect)
	{
		$result = $strValue;

		// 対象が空でないことを確認
		if( !empty($strValue)){
			// 最後尾が連結文字列でない場合、追加
			if( substr($strValue, -1) != $connect){
				$result = $strValue.$connect;
			}
		}

		return $result;
	}

	/**
	*	Cookieデータ取得
	*	サブキーをインデックスにした連想配列を返す
	*
	*	strName：Cookieの名称
	*/
	public function getCookie($strName)
	{
		$result = array();

		try {
			$cookieVal = $_COOKIE[$strName];
	
			$cookieArray = explode("&",$cookieVal);
	
			// 物件別データを連想配列に格納
			foreach($cookieArray as $bukenData ){
				// Cookieサブキーと値を分割
				$temp = explode("=",$bukenData);
				// 連想配列に格納
				$tempArray[$temp[0]] = $temp[1];
			}
	
			// 空要素削除
			$result = array_diff( $tempArray, array( "" ) );
		}
		catch(Exception $e)
		{
			// エラーメッセージをログに書き出す
			__log_debug(__FILE__, __LINE__, __METHOD__, $e->getMessage());
		}

		return $result;
	}

	/**
	*	サブキーを20以上持つCookieデータをまとめて取得
	*
	*	サブキーをインデックスにした連想配列を返す
	*
	*	strName：Cookieの名称
	*/
	public function getCookieAll($strName,$maxCnt)
	{
		$result = array();

		$cookieCnt = (int)($maxCnt / Apm_Config_Rstdtl::MAX_CNT_SUBKEY) + 1;

		for($i=1;$i <= $cookieCnt; $i++){
			$temp = $this->getCookie($strName.$i);

			foreach($temp as $key => $value){
				$result[$key] = $value;
			}
		}

		return $result;
	}

	/**
	*	Cookieへ登録
	*
	*	strCookieVal：Cooki登録用情報
	*	strName：Cookieの名称
	*	strCntName：カウント用Cookieの名称
	*	intMaxCnt：Cookie登録Maxカウント
	*/
	public function setCookie($data,$strName,$strCntName,$intMaxCnt)
	{

		$returnMsg = "";
		try {
			// 登録件数
			$strLiteCnt = $_COOKIE[$strCntName];
			if ($strLiteCnt == ""){
				$strLiteCnt=0;
			}
			// 物件データCookieを連想配列で取得
			$cookieArray = $this->getCookieAll($strName,$strLiteCnt);

			// 物件が掲載落ちしていないかチェック
			$result = array();
			if (!empty($cookieArray))
			{
				$sql = "select T03_HEYA_CD from T03WEB_HEYA where T03_HEYA_CD in (";
				foreach ($cookieArray as $key => $val) {
					$sql .= " :".$key." ,";
				}
				// 最後の1文字を削除
				$sql = substr($sql, 0, -1);
				$sql .= ")";
				// 検索
				$result = $this->dbGetList($sql, $cookieArray);
			}

			// 登録件数チェック
			if (count($result) >= $intMaxCnt)
			{
				return "上限";
			}
			// 一次元配列化
			$result_array = array();
			foreach ($result as $val) {
				$result_array[] = $val['T03_HEYA_CD'];
			}
			// 既に登録済みか
			if (in_array($data, $result_array))
			{
				return "この物件情報は既にお気に入りに登録されています。";
			}

			if(!empty($cookieArray)){
				// キーで昇順ソート
				ksort($cookieArray);
			}
			$tempArray = array();
			$cnt=0;
			foreach($cookieArray as $val)
			{
				// 掲載落ち物件でなければ、配列に追加
				if (in_array($val,$result_array)) {
					$cnt++;
					$tempArray[(int)($cnt / Apm_Config_Rstdtl::MAX_CNT_SUBKEY)][] = $val;
				}
			}
			// 登録データを追加
			if (!empty($data))
			{
				$cnt++;
				$tempArray[(int)($cnt / Apm_Config_Rstdtl::MAX_CNT_SUBKEY)][] = $data;
			}

			// 保持期間設定
			$limit = time() + (Apm_Config_Rstdtl::DAY_KEEP_COOKIE * 24 * 3600);
			// クッキー削除
			$this->DeleteAllCookie($strName, $strCntName);
			// Cookie再作成
			$tempStr = "";
			foreach ($tempArray as $key => $val) {
				foreach ($val as $final_key => $final_val ) {
					$tempStr .= "Bukken" .($final_key + 1). "=". $final_val ."&";
				}
				// 最後尾の & 削除
				$tempStr = mb_substr($tempStr, 0 ,mb_strlen($tempStr) -1 );
				
				// Cookie再作成
				setrawcookie($strName.($key + 1), $tempStr, $limit, "/");
			}
			// 登録件数Cookie再作成
			if ($cnt > 0) {
				setcookie($strCntName, $cnt, $limit, "/");
			}
/*
			for ($i=1; $i <= $intMaxCnt; $i++){

				// 登録済み判定
				if($cookieArray["Bukken".$i] != $data){
					// 空判定
					if ($cookieArray["Bukken".$i] == ""){

						// Cookie名称取得
						$cookieName = $this->getCookieName($i,$strName);

						// オリジナルCookieデータ
						$original = $this->addConnectStr($_COOKIE[$cookieName],"&");

						// 登録Cookieデータ設定
						$setcookie = $original."Bukken".$i."=". $data ."&";

						// Cookie設定
						setrawcookie($cookieName, $setcookie, $limit,"/");
						// 物件登録数更新
						setcookie($strCntName,$strLiteCnt+1,$limit,"/");
						break;
					}
				}else{
					$returnMsg = "この物件情報は既にお気に入りに登録されています。";
					break;
				}

				if ($i == $intMaxCnt){
					$returnMsg = "上限";
				}
			}
*/
		}
		catch(Exception $e)
		{
			// エラーメッセージをログに書き出す
			__log_debug(__FILE__, __LINE__, __METHOD__, $e->getMessage());
			// クッキー削除
			$this->DeleteAllCookie($strName, $strCntName);
			$returnMsg = "登録に失敗しました";
		}

		return $returnMsg;
	}

	/**
	*	Cookie削除
	*
	*	指定されたインデックスのサブキーを削除する。
	*
	*	data   ：確認対象データ
	*	strName：Cookieの名称
	*/
	public function DeleteCookie($delIndex,$strName,$strCntName)
	{
		$tempArray = array();
		$tempStr ="";
		$cnt = 1;

		// 保持期間設定
		$limit = time() + (Apm_Config_Rstdtl::DAY_KEEP_COOKIE * 24 * 3600);

		// 登録数取得
		$cookieCnt = $_COOKIE[$strCntName];

		// 物件データCookieを連想配列で取得
		$cookieArray = $this->getCookieAll($strName,$strLiteCnt);

		if(empty($cookieArray)){
			// キーで昇順ソート
			ksort($cookieArray);
		}

		// 設定数ループ
		for ($i=1; $i <= $cookieCnt; $i++){
			// 登録済み判定
			if($i != $delIndex){
				// 配列再構築
				$tempArray[(int)($cnt / Apm_Config_Rstdtl::MAX_CNT_SUBKEY)][] = $cookieArray["Bukken".$i];
				$cnt ++;
			}
		}

		// Cookie再作成
		foreach ( $tempArray as $key => $val) {
			foreach ( $val as $final_key => $final_val ) {
				$tempStr .= "Bukken" .($final_key + 1). "=". $final_val ."&";
			}
			// 最後尾の & 削除
			$tempStr = mb_substr($tempStr, 0 ,mb_strlen($tempStr) -1 );

			// Cookie再作成
			setrawcookie($strName.($key + 1), $tempStr, $limit,"/");
		}

		// トータル件数 1 マイナス
		$cookieCnt = $cookieCnt - 1;

		// 登録件数Cookie再作成
		setcookie($strCntName, $cookieCnt, $limit,"/");

	}

	/**
	*	Cookie全削除
	*
	*	指定されたCookieを削除する。
	*
	*	maxIndex：件数最大値
	*	strName ：Cookieの名称
	*/
	public function DeleteAllCookie($strName,$strCntName)
	{
		$index = (int)($_COOKIE[$strCntName] / Apm_Config_Rstdtl::MAX_CNT_SUBKEY) + 1;

		for($i = 1;$i<=$index;$i++){
			setcookie($strName.$i, "",time() - 60,"/");
		}

		setcookie($strCntName, "",time() - 60,"/");
	}

	/**
	*	Cookie名称取得
	*
	*	data   ：確認対象データ
	*	strName：Cookieの名称
	*/
	public function getCookieName($Id,$CName){

		$nameIndex = (int)($Id / Apm_Config_Rstdtl::MAX_CNT_SUBKEY) + 1;

		return  $CName.$nameIndex;
	}

	/**
	*	Cookieの存在確認
	*
	*	data   ：確認対象データ
	*	strName：Cookieの名称
	*/
	public function isCookie($data,$strName,$strCntName)
	{
		$result = false;

		// 登録数取得
		$cookieCnt = $_COOKIE[$strCntName];

		// Cookieを連想配列で取得
		$cookieArray = $this->getCookieAll($strName,$cookieCnt);

		foreach($cookieArray as $cookie){
			if($cookie == $data){
				$result = true;
			}
		}

		return $result;
	}
}
?>